<?php

/**
 * 系统配置项实体操作类
 * @note  实现了对了系统配置项的基本增删改查工作
 * @class  XTPZX
 * @file  XTPZX.class.php
 * @author 赤菁风铃
 * @time  2014年04月10日 22:40:14
 * @database  SQLServer
 */

/**
 * Class _XTPZX 系统配置项数据操作类
 */
class _XTPZX
{
    #region 自动生成代码
    #region 构造函数
    public function __construct($data = null){
        $this->XTPZX_PZM = ''; //系统配置项配置名
        $this->XTPZX_PZZ = ''; //系统配置项配置值
        $this->XTPZX_SM = ''; //系统配置项说明
        $this->XTPZX_FJ = ''; //系统配置项附件
        if(!is_null($data))
        {
            if(array_key_exists('XTPZX_PZM',$data)) $this->XTPZX_PZM = $data["XTPZX_PZM"];
            if(array_key_exists('XTPZX_PZZ',$data)) $this->XTPZX_PZZ = $data["XTPZX_PZZ"];
            if(array_key_exists('XTPZX_SM',$data)) $this->XTPZX_SM = $data["XTPZX_SM"];
            if(array_key_exists('XTPZX_FJ',$data)) $this->XTPZX_FJ = $data["XTPZX_FJ"];
        }
    }
    #endregion 构造函数
        
    #region 实体固有属性
    
    /**
     * 属性  系统配置项配置名
     * @name  XTPZX_PZM
     * @type  string
     */
    public $XTPZX_PZM;
    
    /**
     * 属性  系统配置项配置值
     * @name  XTPZX_PZZ
     * @type  string
     */
    public $XTPZX_PZZ;
    
    /**
     * 属性  系统配置项说明
     * @name  XTPZX_SM
     * @type  string
     */
    public $XTPZX_SM;
    
    /**
     * 属性  系统配置项附件
     * @name  XTPZX_FJ
     * @type  string
     * @note  按照指定分辨率自动裁切图片，
     */
    public $XTPZX_FJ;
    #endregion 实体固有属性
        
    #region 获取外键实体函数
    #endregion 获取外键实体函数    
    
    #region 校验数据
    /**
     * @note  在进行数据更新和数据插入之前,对对象的属性进行服务端验证
     * @return  string 返回空字符串表示通过验证，否则直接返回错误信息，多条错误用;（半角分号）分隔多条错误
     */
    public function validate()
    {
    
        $result = array();
            
        #region 系统配置项配置名验证   
        $flag=true;
        //配置名最大长度为50
        if($flag && (count(unpack('C*',$this->XTPZX_PZM )) > 50)){ 
            $flag=false;
            array_push($result,'配置名最大长度为50'); 
        }
        //配置名必须填写
        if($flag && (is_null($this->XTPZX_PZM) || $this->XTPZX_PZM==='')){ 
            array_push($result,'配置名必须填写'); 
        }
        #endregion 系统配置项配置名验证   
            
        #region 系统配置项配置值验证   
        $flag=true;
        //配置值最大长度为500
        if($flag && (count(unpack('C*',$this->XTPZX_PZZ )) > 500)){ 
            array_push($result,'配置值最大长度为500'); 
        }
        #endregion 系统配置项配置值验证   
            
        #region 系统配置项说明验证   
        $flag=true;
        //说明最大长度为500
        if($flag && (count(unpack('C*',$this->XTPZX_SM )) > 500)){ 
            array_push($result,'说明最大长度为500'); 
        }
        #endregion 系统配置项说明验证   
            
        #region 系统配置项附件验证   
        $flag=true;
        //附件最大长度为500
        if($flag && (count(unpack('C*',$this->XTPZX_FJ )) > 500)){ 
            array_push($result,'附件最大长度为500'); 
        }
        #endregion 系统配置项附件验证   
        return  implode("<br/>", $result);
    }
    #endregion 校验数据
    
    #region 插入数据
    /**
     * @note  插入数据
     * @return string 返回空字符串表示操作成功，其它情况返回的是错误提示信息
     */
    public function insert()
    {
        //数据校验
        $message = $this->validate();
        if (!empty($message)) {
            return $message;
        }
                
        //准备sql语句
        $sql = "INSERT INTO XTPZX(
                        XTPZX_PZM
                        ,XTPZX_PZZ
                        ,XTPZX_SM
                        ,XTPZX_FJ
                       )
                 VALUES(
                        :XTPZX_PZM
                        ,:XTPZX_PZZ
                        ,:XTPZX_SM
                        ,:XTPZX_FJ
                       )";
        //创建pdo对象，并绑定执行参数               
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));       
        $stmt = $pdo->prepare($sql);
        //准备sql语句所需参数
        $stmt->bindParam(':XTPZX_PZM',$this->XTPZX_PZM); //系统配置项配置名
        $stmt->bindParam(':XTPZX_PZZ',$this->XTPZX_PZZ); //系统配置项配置值
        $stmt->bindParam(':XTPZX_SM',$this->XTPZX_SM); //系统配置项说明
        $stmt->bindParam(':XTPZX_FJ',$this->XTPZX_FJ); //系统配置项附件
        $stmt->execute();
        if ($stmt->rowCount() === 1) {
            return "";
        }
        if (strpos($stmt->errorInfo()[2], "重复", 0)) {
            return "重复项添加失败";
        }
        if (strpos($stmt->errorInfo()[2], "截断", 0)) {
            return "数据超长";
        }
        return $stmt->errorInfo()[2];
    }
    #endregion 插入数据
    
    #region 更新数据
    /**
     * @note  更新数据
     * @param string $xtpzx_pzm_ora 拟更新的XTPZX实体主键值，如果为空，表示更新当前实体.
     * @return string 返回空字符串表示操作成功，其它情况返回的是错误提示信息
     */ 
    public function update($xtpzx_pzm_ora = null )
    {
        //数据校验
        $message = $this->validate();
        if (!empty($message)) {
            return $message;
        }
        
        //准备sql语句
        $sql = "UPDATE XTPZX SET 
                    XTPZX_PZM=:XTPZX_PZM
                    ,XTPZX_PZZ=:XTPZX_PZZ
                    ,XTPZX_SM=:XTPZX_SM
                    ,XTPZX_FJ=:XTPZX_FJ
                WHERE
                    XTPZX_PZM=:XTPZX_PZM_ORA
                    ";
        
        //准备pdo对象
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));
        $stmt = $pdo->prepare($sql);
        //准备sql语句所需参数
        $stmt->bindParam(':XTPZX_PZM_ORA',empty($xtpzx_pzm_ora)?$this->XTPZX_PZM:$xtpzx_pzm_ora); //系统配置项配置名
        $stmt->bindParam(':XTPZX_PZM',$this->XTPZX_PZM); //系统配置项配置名
        $stmt->bindParam(':XTPZX_PZZ',$this->XTPZX_PZZ); //系统配置项配置值
        $stmt->bindParam(':XTPZX_SM',$this->XTPZX_SM); //系统配置项说明
        $stmt->bindParam(':XTPZX_FJ',$this->XTPZX_FJ); //系统配置项附件
        $stmt->execute();
        if ($stmt->rowCount() === 1) {
            return "";
        }
        return $stmt->errorInfo()[2];
    }
    #endregion 更新数据
    
    #region 删除数据 
    /**
     * @note  根据主键信息删除XTPZX对象
     * @param  string $xtpzx_pzm_ora 拟删除的XTPZX实体主键值，如果为空，表示删除当前实体.
     * @return string 返回空字符串表示操作成功，其它情况返回的是错误提示信息
     */ 
    public function delete($xtpzx_pzm_ora = null )
    {
        
        //准备sql语句
        $sql = "Delete From XTPZX where 
                    XTPZX_PZM=:XTPZX_PZM_ORA
                    ";
         //执行sql语句
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));
        $stmt = $pdo->prepare($sql);
        //准备sql语句所需参数
        if($xtpzx_pzm_ora==null){
            $xtpzx_pzm_ora=$this->XTPZX_PZM;
        }
        $stmt->bindParam(':XTPZX_PZM_ORA',empty($xtpzx_pzm_ora)?$this->XTPZX_PZM:$xtpzx_pzm_ora); //系统配置项配置名
        $stmt->execute();
        
        if ($stmt->rowCount() === 1) {
            return "";
        }
        //需要根据不同的数据库检查不同的返回值
        if (strpos($stmt->errorInfo()[2], "约束", 0)) {
            return "存在依赖的相关信息，不能进行删除";
        }
        return $stmt->errorInfo()[2];                    
    }
    #endregion 删除数据
    
    #region 获取单个对象 
    /**
     * @note  根据主键信息获取单个XTPZX对象
     * @param  string $xtpzx_pzm_ora 拟获取的XTPZX实体主键值，如果为空，表示按照当前实体的主键属性重新获取实体.
     * @return string 返回空字符串表示操作成功，其它情况返回的是错误提示信息
     */ 
    public function fetch($xtpzx_pzm_ora = null )
    {
        
        //准备sql语句所需参数
        $params[":XTPZX_PZM_ORA"] = is_null($xtpzx_pzm_ora) ? $this->XTPZX_PZM : $xtpzx_pzm_ora ; //系统配置项_配置名
        
        //准备sql语句
        $sql = "SELECT 
                    XTPZX_PZM
                    ,XTPZX_PZZ
                    ,XTPZX_SM
                    ,XTPZX_FJ
                  FROM XTPZX 
                  WHERE
                    XTPZX_PZM = :XTPZX_PZM_ORA
                ";
        
        //  执行sql语句
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($result !== false) {
            $this->XTPZX_PZM = is_null($result["XTPZX_PZM"] ) ? '' : $result["XTPZX_PZM"];
            $this->XTPZX_PZZ = is_null($result["XTPZX_PZZ"] ) ? '' : $result["XTPZX_PZZ"];
            $this->XTPZX_SM = is_null($result["XTPZX_SM"] ) ? '' : $result["XTPZX_SM"];
            $this->XTPZX_FJ = is_null($result["XTPZX_FJ"] ) ? '' : $result["XTPZX_FJ"];
            return "";
        } else {
            return "要获取的对象不存在";
        }
    }
    #endregion 获取单个对象 
    
    #region 尝试获取单个对象，并返回获取的对象
    /**
     * @note  尝试获取单个XTPZX对象，并返回获取的对象
     * @param  string $xtpzx_pzm_ora 拟获取的XTPZX实体主键值，如果为空，表示按照当前实体的主键属性重新获取实体.
     * @return XTPZX 返回null表示操作失败，其它情况返回要获取的对象
     */
    public static function create($xtpzx_pzm_ora )
    {
        //准备sql语句所需参数
        $params[":XTPZX_PZM_ORA"] = $xtpzx_pzm_ora ; //系统配置项_配置名
        
        //准备sql语句
        $sql = "SELECT 
                    XTPZX_PZM
                    ,XTPZX_PZZ
                    ,XTPZX_SM
                    ,XTPZX_FJ
                  FROM XTPZX 
                  WHERE
                    XTPZX_PZM = :XTPZX_PZM_ORA
                ";
        
        //  执行sql语句
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        $xtpzx = new XTPZX();
        if ($result !== false) {
            $xtpzx->XTPZX_PZM = is_null($result["XTPZX_PZM"] ) ? '' : $result["XTPZX_PZM"];
            $xtpzx->XTPZX_PZZ = is_null($result["XTPZX_PZZ"] ) ? '' : $result["XTPZX_PZZ"];
            $xtpzx->XTPZX_SM = is_null($result["XTPZX_SM"] ) ? '' : $result["XTPZX_SM"];
            $xtpzx->XTPZX_FJ = is_null($result["XTPZX_FJ"] ) ? '' : $result["XTPZX_FJ"];
            return $xtpzx;
        } else {
            return null;
        }
    }
    #endregion 根据主键创建对象（如果存在记录自动进行填充）
    
    #region 获取一组XTPZX信息对象
    /**
     * @note 获取一组用户信息信息对象.
     * @param array $param 参数数组
     * @param int $pageSize 分页尺寸
     * @param int $pageIndex 当前页
     * @param string $orderby 排序语句（需要包括 order by ）
     * @param string $sql 用户自定义使用的SQL语句
     * @return array 带分页信息的对象数组
     */
    public static function query($param = array() , $pageSize = 0 , $pageIndex = 1 , $orderby="" , $sql= "")
    {
    
        #region 声明和处理常用变量
        
        //生成返回值变量
        $result = array();
               
        //处理sql语句默认值
        if(empty($sql)){
            $sql ="select XTPZX.* from XTPZX ";
        }
        
        //自动过滤掉返回结果集中的超文本字段
        $sqlreplace ='
                    XTPZX.XTPZX_PZM
                    ,XTPZX.XTPZX_PZZ
                    ,XTPZX.XTPZX_SM
                    ,XTPZX.XTPZX_FJ
                     ';
        $sql = str_replace( 'XTPZX.*', $sqlreplace , $sql);
        
        //处理传入的参数
        $params = array();
        foreach ($param as $key => $value) {
            if($value == null || $value == ""){
                continue;
            }
            $params[":" . strtoupper(str_replace(":", "", $key))] = $value;
        }
    
        //排序条件
        if (empty($orderby))
        {
            $orderby = "order by XTPZX.XTPZX_PZM";
        }
                
        $where = " WHERE 1 = 1 ";
        
        // XTPZX表的模糊查询条件
        if (array_key_exists(':MHCX',$params) )
        {
            $where.=" and (XTPZX.XTPZX_PZM + '_' + XTPZX.XTPZX_PZZ) like '%' + :MHCX + '%' ";
        }
        
        // XTPZX_PZM精确查询条件
        if (array_key_exists(':XTPZX_PZM',$params) )
        {
            $where.=" and XTPZX.XTPZX_PZM = :XTPZX_PZM ";
        }
        
        // XTPZX_PZZ精确查询条件
        if (array_key_exists(':XTPZX_PZZ',$params) )
        {
            $where.=" and XTPZX.XTPZX_PZZ = :XTPZX_PZZ ";
        }
        #endregion 声明和处理常用变量
        
        #region 获取记录总数和分页相关信息
        
        $pdo = new PDO(C("AUTO_GENERATOR_DB_DSN"), C("AUTO_GENERATOR_DB_USER"), C("AUTO_GENERATOR_DB_PWD"));
        $stmt = $pdo->prepare("select count(*) from ($sql $where) TTT");
        $stmt->execute($params);
        $result['TotalCount'] = intval($stmt->fetch()[0]);

        if($pageSize === 0){
            $result['TotalPages'] = 1;
            $result['PageIndex'] = 1;
            $result['PageSize'] = $result[0];
            $beginRow= 1;
            $endRow = $result['TotalCount'];    
        }
        else{
            $result['PageSize'] = $pageSize;
            $result['TotalPages'] = intval((($result['TotalCount'] - 1) / $result['PageSize'])) + 1;
            $result['PageIndex'] = min(max(1,$pageIndex), $result['TotalPages']);
            $beginRow = ($result['PageIndex'] - 1) * $result['PageSize'] + 1;
            $endRow = $result['PageIndex'] * $result['PageSize'];
        }
        $result['HasPreviousPage'] = $result['PageIndex'] > 1;
        $result['HasNextPage'] = $result['PageIndex'] < $result['TotalPages'];
        $result['IsFirstPage'] = $result['PageIndex'] == 1;
        $result['IsLastPage'] = $result['PageIndex'] == $result['TotalPages'];
        $result['BoolPage'] = $pageSize == 0;
        #endregion 获取记录总数和分页相关信息
        
        #region 查询数据库并返回结果
        $result['DataList'] = array();
        //SQLServer获取结果集
        $sql="SELECT ROW_NUMBER() over($orderby) as rownumber ,".substr($sql,6);
        $sql = "SELECT * FROM ( 
                        $sql $where
                    ) as TTT where rownumber between $beginRow and $endRow ";
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $temp=new XTPZX();
            foreach($row as $key=>$value){
                $temp->$key = $value;
            }
            array_push($result['DataList'],$temp);
        }
        return $result;
        #endregion 查询数据库并返回结果
    }
    #endregion 获取XTPZX信息对象DataResponse
    
    #region 获取XTPZX子表表名数组
    /**
     * @note 返回子表表名数组.
     * @return array 子表表名数组
     */
    public static function subtables()
    {
        //生成返回值变量
        $result = array();
        
        
        return $result;
    }
    #endregion 获取XTPZX子表表名数组
    #endregion 自动生成代码
   
    #endregion 扩展属性

}
